I dati possono essere scaricati in formato JSON dal client desktop di Telegram, andando in Settings - Export Telegram Data e selezionando Private Group (deselezionare Only my messages) e infine scegliendo il formato Machine-readable JSON.
Elenco delle chat disponibili:
for chat in datastore["chats"]["list"]:
print(chat["name"])
Spam Nuarés 4K Magia Nell'Aria I Lord(i) dello Spam Montagna forever Multinerdchat FIFA18 Mundialito Edition Il Gioco del Trono Richiamo A.A.C. Val Grande, Traversata Sud-Nord Aiutino Take my heart when you go Parcheggio idee Netflix Releases Regali per la Francy, festeggiamenti 21 e 28 aprile FIFA17 - Dexter Returns Capodanno Craveggia Capodanno Craveggia Comunicazioni tecniche partita oggi Parcheggio idee Il Gioco del Trono Giropasta E3 2016
ChatMessages.tail()
| action | actor | address | date | duration_seconds | edited | file | forwarded_from | from | height | ... | reply_to_message_id | sticker_emoji | text | thumbnail | title | type | via_bot | width | day | time | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 45444 | NaN | NaN | NaN | 2018-09-05 09:23:54 | NaN | 1970-01-01T01:00:00 | NaN | NaN | Matteo | NaN | ... | NaN | NaN | Quanti ottimi sticker nuovi | NaN | NaN | message | NaN | NaN | 2018-09-05 | 09:23:54 |
| 45445 | NaN | NaN | NaN | 2018-09-05 09:43:30 | NaN | 1970-01-01T01:00:00 | NaN | NaN | Marta | NaN | ... | NaN | NaN | 👍 | NaN | NaN | message | NaN | NaN | 2018-09-05 | 09:43:30 |
| 45446 | NaN | NaN | NaN | 2018-09-05 20:52:05 | NaN | 1970-01-01T01:00:00 | NaN | NaN | Matteo | NaN | ... | NaN | NaN | [{'type': 'link', 'text': 'https://youtu.be/EO... | NaN | NaN | message | NaN | NaN | 2018-09-05 | 20:52:05 |
| 45447 | NaN | NaN | NaN | 2018-09-05 20:52:34 | NaN | 1970-01-01T01:00:00 | NaN | NaN | Matteo | NaN | ... | NaN | NaN | 😂 ho appena provato con man... cioè con bocca ... | NaN | NaN | message | NaN | NaN | 2018-09-05 | 20:52:34 |
| 45448 | NaN | NaN | NaN | 2018-09-05 21:08:15 | NaN | 1970-01-01T01:00:00 | NaN | NaN | Marco | NaN | ... | NaN | NaN | [{'type': 'mention', 'text': '@crusholo', 'fro... | NaN | NaN | message | NaN | NaN | 2018-09-05 | 21:08:15 |
5 rows × 27 columns
totali
Per prima cosa mi piacerebbe riuscire a plottare numero di messaggi giornalieri di ogni persona. Usando .groupby('day','from').size() avremo le dimensioni.
andtemp
pd.DataFrame(DeltaTimeStat).set_index('Nome')
| Massima | Media | |
|---|---|---|
| Nome | ||
| Alessandra | 26 days 12:33:36 | 1 days 07:17:44.395397 |
| Francesca | 5 days 20:20:52 | 0 days 04:45:40.399110 |
| Giuseppe | 4 days 14:02:58 | 0 days 04:54:42.255730 |
| Luigi | 56 days 16:33:38 | 6 days 20:07:45.452054 |
| Marco | 3 days 01:46:09 | 0 days 01:34:54.236883 |
| Marta | 6 days 13:30:23 | 0 days 04:33:53.682771 |
| Matteo | 2 days 02:36:48 | 0 days 01:27:20.662860 |
| Riccardo | 4 days 12:32:56 | 0 days 02:47:05.784798 |
| Roberto | 9 days 00:50:41 | 0 days 01:45:01.986931 |
| Simone | 53 days 14:14:54 | 2 days 11:45:05.326530 |
| Stefano | 12 days 21:04:42 | 0 days 10:43:57.606038 |
Creiamo lista che contiene i dizionari presenti nel field text del dataframe. Poi facciamo dataframe a partire da quella lista di dict.
link.tail()
| from | href | text | type | user_id | |
|---|---|---|---|---|---|
| 1823 | Matteo | NaN | https://scontent-mxp1-1.xx.fbcdn.net/v/t1.0-9/... | link | NaN |
| 1824 | Matteo | NaN | https://www.instagram.com/p/BnWU3VQBHe1/?utm_s... | link | NaN |
| 1825 | Marco | NaN | https://www.instagram.com/p/Bl8g-hegMUc/?utm_s... | link | NaN |
| 1826 | Matteo | NaN | https://www.instagram.com/p/BnWIj9FAtXt/?utm_s... | link | NaN |
| 1827 | Matteo | NaN | https://youtu.be/RW2t8xnwFfE | link | NaN |
Per qualche motivo ci sono menzioni che hanno type mention e anche mention_name quindi serve unire in un unico dataframe i due gruppi, con pd.concat().
menzioni
Apprezziamo come Telegram riveli come il taggante salva in rubrica il taggato:
Creiamo colonna con i soli domini degli indirizzi, in modo che poi sia possibile raggruppare in base a questo parametro:
from collections import Counter
Counter(domini['dominio']).most_common(20)
[('www.instagram.com', 844),
('www.youtube.com', 194),
('www.facebook.com', 69),
('www.reddit.com', 24),
('www.imgur.com', 22),
('calciatoribrutti.com', 16),
('twitter.com', 14),
('www.amazon.it', 12),
('www.theverge.com', 12),
('streamable.com', 9),
('www.chiamarsibomber.com', 8),
('www.sportmediaset.mediaset.it', 7),
('www.metacritic.com', 7),
('www.engadget.com', 6),
('media.giphy.com', 5),
('shop.lego.com', 5),
('www.mondofox.it', 5),
('gfycat.com', 5),
('sport.sky.it', 5),
('goo.gl', 5)]
Prendiamo solo quelli che fanno riferimento a instragram e interroghiamo le api di instragram per scoprire nome account della immagine linkata. Creiamo nuova colonna con questa informazione, raggruppiamo per autore messaggio e account instagram; selezioniamo un solo autore messaggio, ordiniamo per numero di occorrenze di account instragram e facciamo barplot. Inoltre per il plot non consideriamo gli HTTPError400.
FigInsta = plotinstaautore(insta,'Roberto')
plotinstaautore(insta,'Matteo')
plotinstaautore(insta,'Marco')
IDora
IDday
totDayOra
IDDayHour
Classifica sticker più utilizzati:
FigSticker
Classifica emoji più utilizzati all'interno di messaggi di testo:
FigEmoji
plt.figure(dpi=800)
plt.imshow(nuvola,interpolation="bilinear")
plt.axis("off")
plt.tight_layout()
print(f"Durata totale di messaggi audio/video: {ChatMessages['duration_seconds'].sum()} secondi")
Durata totale di messaggi audio/video: 4166.0 secondi